package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

//定义注册请求数据的结构体
type signUpReq struct {
	Email             string `json:"email"`
	Password          string `json:"password"`
	ConfirmedPassword string `json:"confirmed_password"`
}

//定义响应数据的结构体
type commonResponse struct {
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

func home(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "这是主页")
}

func signUp(w http.ResponseWriter, r *http.Request) {
	//创建新的结构体 用于存放client的请求数据
	req := &signUpReq{}
	//读取Body数据
	body, err := io.ReadAll(r.Body)
	if err != nil {
		fmt.Fprintf(w, "read body failed: %v", err)
		//如果读取失败 立即返回
		return
	}
	//对读取到的Body数据进行反序列化 存于req
	err = json.Unmarshal(body, req)
	if err != nil {
		fmt.Fprintf(w, "deserialized failed: %v", err)
		//如果解析失败 同样立即返回
		return
	}
	//拿到反序列化req数据 就可以去做进一步处理 如进行真正注册、写入数据库等等
	//这里只是做一下简单打印
	fmt.Printf("Log-Req-%v", req)

	//创建响应数据
	resp := &commonResponse{
		Msg:  "Success",
		Data: "Sign up successful",
	}
	//对响应数据进行序列化处理
	respJson, _ := json.Marshal(resp)
	//写入响应
	fmt.Fprint(w, string(respJson))
}

func main() {
	//注册路由 当命中路由后会执行后面的func
	http.HandleFunc("/", home)
	http.HandleFunc("/signup", signUp)
	//启动服务监听
	http.ListenAndServe(":8080", nil)
}
